home *** CD-ROM | disk | FTP | other *** search
/ Interactive Web Graphics with Shout 3D / Interactive Web Graphics With Shout 3D.iso / mac / Code / Chapter08 / BetterRotateMovePanel.java < prev    next >
Text File  |  2000-09-08  |  3KB  |  132 lines

  1.  
  2.  
  3.  
  4. package applets;
  5.  
  6. import shout3d.*;
  7. import shout3d.core.*;
  8. import shout3d.math.*;
  9.  
  10.  
  11. public class BetterRotateMovePanel extends Shout3DPanel implements DeviceObserver, RenderObserver {
  12.    
  13.    Transform mover;
  14.  
  15.    int pixelStartX;
  16.    int pixelStartY;
  17.    int pixelEndX;
  18.    int pixelEndY;
  19.  
  20.    float[] worldPos = new float[3];
  21.  
  22.    float [] eulers = new float [3];
  23.    float [] axisAngle = new float [4];
  24.    Quaternion q = new Quaternion();
  25.  
  26.  
  27.    public BetterRotateMovePanel (Shout3DApplet applet){
  28.       super(applet);
  29.    }
  30.    
  31.    public void customInitialize() {
  32.  
  33.       addDeviceObserver(this,"MouseInput", null);
  34.       getRenderer().addRenderObserver(this,null);
  35.  
  36.       mover = (Transform) getNodeByName("vehicle");
  37.  
  38.       worldPos = mover.translation.getValue();
  39.  
  40.       axisAngle = mover.rotation.getValue();
  41.       q.setAxisAngle(axisAngle);
  42.       q.getEulers(eulers);
  43.          
  44.    }
  45.  
  46.  
  47.  
  48.    protected void finalize()  {
  49.  
  50.       removeDeviceObserver(this,"MouseInput");
  51.       getRenderer().removeRenderObserver(this);
  52.    }
  53.  
  54.  
  55.    public boolean onDeviceInput(DeviceInput di, Object userData) {
  56.  
  57.       MouseInput mi = (MouseInput) di;
  58.  
  59.       switch (mi.which){
  60.          case MouseInput.DOWN:
  61.             pixelStartX = mi.x;
  62.             pixelStartY = mi.y;
  63.             return true;                              
  64.  
  65.  
  66.          case MouseInput.DRAG:
  67.  
  68.             //PIXEL OPERATIONS
  69.             pixelEndX = mi.x;
  70.             pixelEndY = mi.y;
  71.             
  72.             int dragDistanceX = pixelEndX - pixelStartX;
  73.             int dragDistanceY = pixelEndY - pixelStartY;
  74.  
  75.             pixelStartX = pixelEndX;
  76.             pixelStartY = pixelEndY;
  77.  
  78.  
  79.             //ROTATING THE OBJECT
  80.  
  81.             //convert x drag to rotation
  82.             // at 30 pixels/radian
  83.             float rotationDelta = -(dragDistanceX/30f);
  84.  
  85.             //compute new heading
  86.             eulers[0] = eulers[0] + rotationDelta;
  87.  
  88.             //Convert from Eulers to AxisAngle
  89.             // using the Quaternion
  90.             q.setEulers(eulers);
  91.             q.getAxisAngle(axisAngle);
  92.  
  93.  
  94.             //TRANSLATING THE OBJECT
  95.  
  96.             //covert y drag to distance
  97.             //at 2 meters per pixel
  98.             float translationDelta = dragDistanceY * 2.0f;
  99.  
  100.             //make a vector pointing
  101.             //in z direction
  102.             float[] vector = {0,0, translationDelta};
  103.  
  104.             //rotate the vector using
  105.             //value in quaternion
  106.             q.xform(vector);
  107.  
  108.             //add rotated vector
  109.             //to current position
  110.             worldPos[0] = worldPos[0] + vector[0];
  111.             worldPos[2] = worldPos[2] + vector[2];
  112.  
  113.    
  114.             return true;
  115.  
  116.       }//end of switch
  117.  
  118.       return false;      
  119.    }
  120.    
  121.    public void onPreRender(Renderer r, Object data){
  122.       //set the Transform to
  123.       //updated axis angle values
  124.       mover.rotation.setValue(axisAngle);
  125.  
  126.       //set Transform to new position
  127.       mover.translation.setValue(worldPos);
  128.    }
  129.    public void onPostRender(Renderer r, Object data){
  130.    }
  131.  
  132. } //end of class